<html>
  <head>
    <title>
      事务和异常处理
    </title>
  </head>
  <body>
    <script>
       /*
                        七、事务和异常处理


                                1、使用LocalDistributedEventBus时(分布式事件总线在进程内和本地事件总线一样工作时)

                                        分布式事件总线在进程内工作(默认实现是LocalDistributedEventBus),除非你配置实际的提供程序(例如 K阿发卡 或 RabbitMQ).

                                        进程内事件总线总是"在发布事件的同一工作单元内执行事件处理程序"。

                                        这意味着，如果事件处理程序抛出异常，则相关的工作单元(数据库事务)将回滚。

                                        通过这种方式，你的"应用程序逻辑" 和 "事件处理逻辑" 变得事务性(原子性)且一致。

                                        如果你想忽略事件处理程序中的错误，你必须在处理程序中使用 try-catch 块，并且不应该重新抛出异常。

                                2、使用实际的分布式事件总线时

                                        当你切换到实际的分布式事件总线提供程序(例如 Kafka 或 RabbitMQ) 时，事件处理程序与发布者将在不同的进程(应用程序、微服务)中执行，因为它们的目的是创建分布式系统。

                                        在这种情况下，实现事务性事件发布的唯一方法是使用　＂发件箱/收件箱＂模式，如Outbox/Inbox for Transactional Events部分所述。

                                       
                                如果你不配置发件箱/收件箱模式或使用 LocalDistributedEventBus,则默认情况下，事件将在工作单元结束时发布，
                                
                                就在工作单元完成之前(这意味着在事件处理程序中抛出异常仍然回滚工作单元)，即使你在工作单元中间发布事件也是如此。

                                如果你不想等到工作单元的最后才发布事件，想立即发布事件，你可以使用IDistributedEventBus.PublishAsync方法。


                                 如果要立即执行处理程序，请将onUnitOfWorkComplete 参数设置为 false.

                            ★、在实体/聚合根类中发布事件时，onUnitOfWorkComplete选项不可用（请参阅在实体/聚合根类中发布事件部分）。
                    */
    </script>
  </body>
</html>